home *** CD-ROM | disk | FTP | other *** search
- {
- STEVE GABRILOWITZ
-
- > I was wondering if anyone had any routines they could send me or tell
- > me where to find some routines that show you have to use the
- > fossil I have a file on my BBS called TPIO_100.ZIP,
- }
-
- Unit IO;
-
-
- { FOSSIL communications I/O routines }
- { Turbo Pascal Version by Tony Hsieh }
-
- {}{}{}{ Copyright (c) 1989 by Tony Hsieh, All Rights Reserved. }{}{}{}
-
-
- { The following routines are basic input/output routines, using a }
- { fossil driver. These are NOT all the routines that a fossil }
- { driver can do! These are just a portion of the functions that }
- { fossil drivers can do. However, these are the only ones most }
- { people will need. I highly recommend for those that use this }
- { to download an arced copy of the X00.SYS driver. In the arc }
- { is a file called "FOSSIL.DOC", which is where I derived my }
- { routines from. If there are any routines that you see are not }
- { implemented here, use FOSSIL.DOC to add/make your own! I've }
- { listed enough examples here for you to figure out how to do it }
- { yourself. }
- { This file was written as a unit for Turbo Pascal v4.0. You }
- { should compile it to DISK, and then in your own program type }
- { this right after your program heading (before Vars and Types) }
- { this: "uses IO;" }
- { EXAMPLE: }
- {
-
- Program Communications;
-
- uses IO;
-
- begin
- InitializeDriver;
- Writeln ('Driver is initalized!');
- ModemSettings (1200,8,'N',1); Baud := 1200;
- DTR (0); Delay (1000); DTR (1);
- Writeln ('DTR is now true!');
- CloseDriver;
- Writeln ('Driver is closed!');
- end.
-
- }
-
- { Feel free to use these routines in your programs; copy this }
- { file freely, but PLEASE DO NOT MODIFY IT. If you do use }
- { these routines in your program, please give proper credit to }
- { the author. }
- { }
- { Thanks, and enjoy! }
- { }
- { Tony Hsieh }
-
-
-
-
- INTERFACE
-
- uses
- DOS;
-
- { These are communications routines }
- { that utilize a FOSSIL driver. A }
- { FOSSIL driver MUST be installed, }
- { such as X00.SYS and OPUS!COM... }
-
- type
- String255 = String [255];
-
- var
- Port : Integer; { I decided to make 'Port' a global }
- { variable to make life easier. }
-
- Baud : Word; { Same with Baud }
-
- RegistersRecord: Registers; { DOS registers AX, BX, CX, DX, and Flags }
-
-
- procedure BlankRegisters;
- procedure ModemSettings(Baud, DataBits : Integer; Parity : Char;
- Stopbits : Integer);
- procedure InitializeDriver;
- procedure CloseDriver;
- procedure ReadKeyAhead (var First, Second : Char);
- function ReceiveAhead (var Character : CHAR) : Boolean;
- function Online : boolean;
- procedure DTR(DTRState : Integer);
- procedure Reboot;
- procedure BiosScreenWrite(Character: CHAR);
- procedure WatchDog(INPUT : Boolean);
- procedure WhereCursor(var Row : Integer; var Column : Integer);
- procedure MoveCursor(Row : Integer; Column : Integer);
- procedure KillInputBuffer;
- procedure KillOutputBuffer;
- procedure FlushOutput;
- function InputAvailable : Boolean;
- function OutputOkay : Boolean;
- procedure ReceiveCharacter(var Character : CHAR);
- procedure TransmitCharacter(Character : CHAR; var Status : Integer);
- procedure FlowControl(Control : Boolean);
- procedure CharacterOut(Character : CHAR);
- procedure StringOut(Message : String255);
- procedure LineOut(Message : String255);
- procedure CrOut;
-
-
- IMPLEMENTATION
-
- procedure BlankRegisters;
- begin
- Fillchar(RegistersRecord, SizeOf(RegistersRecord), 0);
- end;
-
- procedure ModemSettings (Baud, DataBits : Integer; Parity : Char;
- StopBits : Integer);
- { Do this after initializing }
- { the FOSSIL driver and also }
- { when somebody logs on }
- var
- GoingOut: Integer;
- begin
- GoingOut := 0;
- Case Baud of
- 0 : Exit;
- 100 : GoingOut := GoingOut + 000 + 00 + 00;
- 150 : GoingOut := GoingOut + 000 + 00 + 32;
- 300 : GoingOut := GoingOut + 000 + 64 + 00;
- 600 : GoingOut := GoingOut + 000 + 64 + 32;
- 1200: GoingOut := GoingOut + 128 + 00 + 00;
- 2400: GoingOut := GoingOut + 128 + 00 + 32;
- 4800: GoingOut := GoingOut + 128 + 64 + 00;
- 9600: GoingOut := GoingOut + 128 + 64 + 32;
- end;
- Case DataBits of
- 5: GoingOut := GoingOut + 0 + 0;
- 6: GoingOut := GoingOut + 0 + 1;
- 7: GoingOut := GoingOut + 2 + 0;
- 8: GoingOut := GoingOut + 2 + 1;
- end;
- Case Parity of
- 'N' : GoingOut := GoingOut + 00 + 0;
- 'O','o': GoingOut := GoingOut + 00 + 8;
- 'n' : GoingOut := GoingOut + 16 + 0;
- 'E','e': GoingOut := GoingOut + 16 + 8;
- end;
- Case StopBits of
- 1: GoingOut := GoingOut + 0;
- 2: GoingOut := GoingOut + 4;
- end;
- BlankRegisters;
- With RegistersRecord do
- begin
- AH := 0;
- AL := GoingOut;
- DX := (Port);
- Intr($14, RegistersRecord);
- end;
- end;
-
- procedure InitializeDriver; { Do this before doing }
- begin { any IO routines!!! }
- BlankRegisters;
- With RegistersRecord do
- begin
- AH := 4;
- DX := (Port);
- Intr($14, RegistersRecord);
- If AX <> $1954 then
- begin
- Writeln('* FOSSIL DRIVER NOT RESPONDING! OPERATION HALTED!');
- halt(1);
- end;
- end;
- end;
-
- procedure CloseDriver; { Run this after all I/O routines are done with }
- begin
- BlankRegisters;
- With RegistersRecord do
- begin
- AH := 5;
- DX := (Port);
- Intr($14, RegistersRecord);
- end;
- BlankRegisters;
- end;
-
- procedure ReadKeyAhead (var First, Second: Char); { This procedure is via }
- { the FOSSIL driver, not }
- { DOS! }
- begin
- BlankRegisters;
- With RegistersRecord do
- begin
- AH := $0D;
- Intr($14,RegistersRecord);
- First := chr(lo(AX));
- Second := chr(hi(AX));
- end;
- end;
-
- function ReceiveAhead (var Character: CHAR): Boolean; { Non-destructive }
- begin
- If Baud=0 then exit;
- BlankRegisters;
- With RegistersRecord do
- begin
- AH := $0C;
- DX := Port;
- Intr ($14,RegistersRecord);
- Character := CHR (AL);
- ReceiveAhead := AX <> $FFFF;
- end;
- end;
-
- function OnLine: Boolean;
- begin
- BlankRegisters;
- With RegistersRecord do
- begin
- AH := 3;
- DX := (Port);
- Intr ($14, RegistersRecord);
- OnLine := ((AL AND 128) = 128);
- end;
- end;
-
- procedure DTR (DTRState: Integer); { 1=ON, 0=OFF }
- { Be sure that the modem dip switches }
- { are set properly... when DTR is off }
- { it usually drops carrier if online }
- begin
- BlankRegisters;
- With RegistersRecord do
- begin
- AH := 6;
- DX := (Port);
- AL := DTRState;
- Intr ($14, RegistersRecord);
- end;
- end;
-
- procedure Reboot; { For EXTREME emergencies... Hmmm... }
- begin
- BlankRegisters;
- With RegistersRecord do
- begin
- AH := 23;
- AL := 1;
- Intr ($14, RegistersRecord);
- end;
- end;
-
- { This is ANSI Screen Write via Fossil Driver }
- {
- procedure ANSIScreenWrite (Character: CHAR);
- begin
- BlankRegisters;
- With RegistersRecord do
- begin
- AH := 19;
- (100 min left), (H)elp, More? AL := ORD (Character);
- Intr ($14, RegistersRecord);
- end;
- end;
- }
-
- { This is ANSI Screen Write via DOS! }
-
- procedure ANSIScreenWrite (Character: CHAR);
- begin
- BlankRegisters;
- With RegistersRecord do
- begin
- AH := 2;
- DL := ORD (Character);
- Intr ($21, RegistersRecord);
- end;
- end;
-
-
- procedure BIOSScreenWrite (Character: CHAR); { Through the FOSSIL driver }
- begin
- BlankRegisters;
- With RegistersRecord do
- begin
- AH := 21;
- AL := ORD (Character);
- Intr ($14, RegistersRecord);
- end;
- end;
-
- procedure WatchDog (INPUT: Boolean);
- begin
- BlankRegisters;
- With RegistersRecord do
- begin
- AH := 20;
- DX := Port;
- Case INPUT of
- TRUE: AL := 1;
- FALSE: AL := 0;
- end;
- Intr ($14, RegistersRecord);
- end;
- end;
-
- procedure WhereCursor (var Row: Integer; var Column: Integer);
- begin
- BlankRegisters;
- With RegistersRecord do
- begin
- AH := 18;
- Intr ($14, RegistersRecord);
- Row := DH;
- Column := DL;
- end;
- end;
-
- procedure MoveCursor (Row: Integer; Column: Integer);
- begin
- BlankRegisters;
- With RegistersRecord do
- begin
- AH := 17;
- DH := Row;
- DL := Column;
- Intr ($14, RegistersRecord);
- end;
- end;
-
- procedure KillInputBuffer; { Kills all remaining input that has not been }
- { read in yet }
- begin
- If Baud=0 then exit;
- BlankRegisters;
- With RegistersRecord do
- begin
- AH := 10;
- DX := Port;
- Intr ($14, RegistersRecord);
- end;
- end;
-
- procedure KillOutputBuffer; { Kills all pending output that has not been }
- { send yet }
- begin
- If Baud=0 then exit;
- BlankRegisters;
- With RegistersRecord do
- begin
- AH := 9;
- DX := Port;
- Intr ($14, RegistersRecord);
- end;
- end;
-
- procedure FlushOutput; { Flushes the output buffer }
- begin
- If Baud=0 then exit;
- BlankRegisters;
- With RegistersRecord do
- begin
- AH := 8;
- DX := Port;
- Intr ($14, RegistersRecord);
- end;
- end;
-
- function InputAvailable: Boolean; { Returns true if there's input }
- { from the modem. }
- begin
- InputAvailable := False;
- If Baud=0 then exit;
- BlankRegisters;
- With RegistersRecord do
- begin
- AH := 3;
- DX := Port;
- Intr ($14, RegistersRecord);
- InputAvailable := ((AH AND 1) = 1);
- end;
- end;
-
- function OutputOkay: Boolean; { Returns true if output buffer isn't full }
- begin
- OutputOkay := True;
- If Baud=0 then exit;
- BlankRegisters;
- With RegistersRecord do
- begin
- AH := 3;
- DX := Port;
- Intr ($14, RegistersRecord);
- OutputOkay := ((AH AND 32) = 32);
- end;
- end;
-
- procedure ReceiveCharacter (var Character: CHAR); { Takes a character }
- { out of the input }
- { buffer }
- begin
- Character := #0;
- BlankRegisters;
- With RegistersRecord do
- begin
- AH := 2;
- DX := Port;
- Intr ($14, RegistersRecord);
- Character := CHR (AL);
- end;
- end;
-
- procedure TransmitCharacter (Character: CHAR; var Status: Integer);
- begin
- BlankRegisters;
- With RegistersRecord do
- begin
- AH := 1;
- DX := Port;
- AL := ORD (Character);
- Intr ($14, RegistersRecord);
- Status := AX; { Refer to FOSSIL.DOC about the STATUS var }
- end;
- end;
-
- procedure FlowControl (Control: Boolean);
- begin
- BlankRegisters;
- With RegistersRecord do
- begin
- AH := 15;
- DX := Port;
- Case Control of
- TRUE: AL := 255;
- FALSE: AL := 0;
- end;
- Intr ($14, RegistersRecord);
- end;
- end;
-
- procedure CharacterOut (Character: CHAR);
- var
- Status: INTEGER;
- begin
- { If SNOOP is on then }
- ANSIScreenWrite (Character);
- TransmitCharacter (Character, Status);
- end;
-
- procedure StringOut (Message: String255);
- var
- CharPos: Byte;
- begin
- CharPos := 0;
- If Length(Message) <> 0 then
- begin
- Repeat
- If NOT Online then exit;
- CharPos := CharPos + 1;
- CharacterOut (Message [CharPos]);
- Until CharPos = Length (Message);
- end;
- end;
-
- procedure LineOut (Message: String255);
- begin
- StringOut (Message);
- CharacterOut (#13);
- CharacterOut (#10);
- end;
-
- procedure CrOut; { Outputs a carriage return and a line feed }
- begin
- CharacterOut (#13);
- CharacterOut (#10);
- end;
-
- end.